#ifndef ANIMATION_H
#define ANIMATION_H

#include "../core/GameComponent.h"
#include "../core/GameObject.h"
#include "../../include/component/Doodle.h"

namespace eats_core {

/**
 * @brief Componente de animação. Basta adiconar a um objeto para adicionar o
 * comportamento de animação.
 *
 * Agradecimentos : http://www.sdltutorials.com/sdl-animation
 *
 */
class Animation : public GameComponent
{
    public:

		/**
		 * @brief Construtor principal. Constroi uma animação com o atlas referênciado na posição indicada. Possíveis melhorias
		 * para a classe: Criar mudar a variável depreciada relative para indicar se é relativo ao conteiner ou a superficie core.
		 *  ? ? Definir a velocidade segundo ao FPS e não segundo ao tempo ? ?
		 *
		 * @param SDL_Surface * _working_suf. Superficie de trabalho padrão. Não passar a superficie principal.
		 * @param std::string atlasPah. Caminho do atlas, desenho que contem todas as poses da animação.
		 * @param int posX. Posição em X referente a superficie core. Relativo a superficie conteiner nao implementada ainda.
		 * @param int posY. Posição em Y referente a superficie core. Relativo a superficie conteiner nao implementada ainda.
		 * @param bool relative. Depreciado. Relativo para doodle.
		 * @param int _maxFrames. Numero de frames contido no atlas.
		 * @param int _tileSize. Tamanho de um sprite do atlas.
		 */
        Animation(SDL_Surface * _working_surf, std::string atlasPath, int * posX, int * posY, bool relative, int _maxFrames, int _tileSize);
        virtual ~Animation();

        /**
         * Define o FrameRate para determinada animação.
         */
        void setFrameRate(int _frameRate){
        	frameRate = _frameRate;
        }

        /**
         * Define o sprite atual. Caso o parametro fuja dos limites positivos e negativos nada é feito.
         */
        void setCurrentFrame(int _currentFrame){
        	if(_currentFrame < 0 || _currentFrame >= maxFrames) return;
        	currentFrame = _currentFrame;
        }

        /**
         * Retorna o frame atual
         */
        int getCurrentFrame(){
        	return currentFrame;
        }

        /**
         * Retorna o largura da animação. Não exatamente implementado.
         */
        int getWidth(){
        	return tileSize;
        };

        /**
         * Retorna a altura da animação. Não exatamente implementado.
         */
        int getHeight(){
        	return tileSize;
        };

        /**
         * Aqui é alterado os sprites a serem exibidos segundo o tempo passado. Ponto para melhoria.
         */
        bool update();

        /**
         * Renderiza o sprite.
         */
        bool render();

        bool setUp();

    protected:
    private:

        /**
         * frame atual, sprite atual.
         */
        int currentFrame;

        /**
         * Sinceramente nao entendo isso direito
         */
        int frameInc;

        /**
         * velocidade para trocar framerate
         */
        int frameRate;

        long oldTime;

        int maxFrames;

        bool oscillate;

        GameObject * objFather;
        Doodle * atlas;

        int * posX, * posY, tileSize;

};

}

#endif // ANIMATION_H
